#include <iostream>
#include <chrono>
#include <ctime>
#include <unistd.h> // sleep：程序休眠
#include <vector>
#include <algorithm>

void BubbleSort(std::vector<int> &v)
{
    for (int i = 0; i < v.size() - 1; i++)
    {
        for (int j = 0; j < v.size() - 1; j++)
        {
            if (v[j] > v[j + 1])
            {
                std::swap(v[j], v[j + 1]);
            }
        }
    }
}

class Timer
{
public:
    void Start()
    {
        start = std::chrono::steady_clock::now();
    }

    void Stop()
    {
        end = std::chrono::steady_clock::now();
    }

    long GetDuration()
    {
        return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
    }
private:
    std::chrono::steady_clock::time_point start;
    std::chrono::steady_clock::time_point end;
};

int main()
{
#if 0
    // 1970/1/1 00:00
    // UTC：格林尼治时间
    while (1)
    {

        sleep(1); // 程序停一秒
        time_t t = time(nullptr);
        tm *m = localtime(&t);
        printf("%d年%d月%d日%d时%d分%d秒\r", m->tm_year + 1900, m->tm_mon + 1, m->tm_mday, m->tm_hour, m->tm_min, m->tm_sec);
        fflush(stdout); // 刷新输出缓冲区
    }
#endif

#if 0
    while (1)
    {

        sleep(1); // 程序停一秒
        time_t t = time(nullptr);
        tm *m = localtime(&t);
        std::cout << ctime(&t) << std::endl;
        fflush(stdout); // 刷新输出缓冲区
    }
#endif

#if 1
    // clock：时钟对象
    // time_point：时间点
    // duration：时间间隔

    // 系统时钟：系统时间
    // std::chrono::system_clock

    // 从系统开机开始算的时间
    // std::chrono::steady_clock;

    // 高精度时钟
    // std::chrono::high_resolution_clock;

    // auto now = std::chrono::system_clock::now();
    // auto time = std::chrono::system_clock::to_time_t(now);
    // std::cout << ctime(&time) << std::endl;

    srand(time(nullptr));
    std::vector<int> v;
    for (int i = 0; i < 20000; i++)
    {
        v.push_back(rand() % 20000 + 1);
    }
    std::vector<int> v2 = v;

    Timer t;
    t.Start();
    std::sort(v.begin(), v.end());
    t.Stop();
    std::cout << t.GetDuration() << std::endl;

    t.Start();
    BubbleSort(v2);
    t.Stop();
    std::cout << t.GetDuration() << std::endl;
#endif
    return 0;
}